package traits

import model.GrupoEmpresas
import scala.collection.mutable.ArrayBuffer
import model.FichaEmpresa
import model.MacroFicha

trait PromediarRegistros extends LimitarRegistrosPorAño {
	self : GrupoEmpresas =>
	  
	  
	  def getMacroFichas(f : MacroFicha => Double) : ArrayBuffer[Double] = {
	    this.empresasFiltradas.map(_.getMacroFicha(this.años)).map(f)
	  }
	  
	  override def totalVentas() : Double = {
		this.getMacroFichas(_.montoVentas / this.años.size).sum
	  }
	  
	  override def totalGanancias() : Double = {
	    this.getMacroFichas(_.montoGanancias / this.años.size).sum
	  }
	  
	 override def totalVentasFold(): Double = {
		val neutro: Double = 0
		val tE = this.getMacroFichas(_.montoVentas / this.años.size)
		tE.foldLeft(neutro)({ (t, valor) => t + valor  })
	 }
	 
	override def fichasConVentasMayoresA(monto: Double): Int = {
		this.getMacroFichas(_.montoVentas / this.años.size).filter(_ > monto).size
	 }
	
	override def fichasConGananciasMayoresA(monto: Double): Int = {
		this.getMacroFichas(_.montoGanancias / this.años.size).filter(_ > monto).size
	 }
	
	override  def fichasConTasaGananciaMayoresA(monto: Double): Int = {
			this.getMacroFichas({ _.tasaGanancia / this.años.size}).filter(_ > monto).size
	 }
	
	override def empresasConVentasMayoresA(monto: Double): ArrayBuffer[String] = {
		 this.empresasFiltradas.filter(_.getMacroFicha(this.años).montoVentas / this.años.size > monto).map(_.nombre)
	 }
	
	override def empresasMaxGanancias(): String = {
		this.empresasFiltradas.maxBy(_.getMacroFicha(this.años).montoGanancias).nombre
	}
	
	override def fuentesQueAportaronAlMenosUnaFicha(): ArrayBuffer[String] = {
			this.empresasFiltradas.map(_.fuente.nombre).distinct
	}
	
	override def createMapByProvincia(): Map[String, Double] = {
		val tuplaM = this.empresasFiltradas.map({ e => (e.departamento.nombre, (e.getMacroFicha(this.años).montoVentas / this.años.size)) })
    	tuplaM.groupBy(_._1).mapValues({ t => t.map(_._2).sum })
	}
	
	
}